package com.wxzz.elearing.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wxzz.elearing.user.dto.*;
import com.wxzz.elearing.user.entity.AdminUser;
import com.wxzz.elearing.user.entity.Enterprise;
import com.wxzz.elearing.user.entity.WxUser;
import com.wxzz.elearing.user.vo.EnterpriseAllStatisticsVo;
import com.wxzz.elearing.user.vo.EnterpriseStatisticsVo;
import com.wxzz.elearing.user.vo.EnterpriseWxUserVisitNumStatisticsVo;
import com.wxzz.elearing.user.vo.WxUserVisitNumStatisticsVo;
import com.wxzz.elearning.common.dto.FeignWxUserDto;
import com.wxzz.elearning.common.vo.JgPageVo;
import com.wxzz.elearning.common.vo.ReturnVO;
import org.springframework.web.multipart.MultipartFile;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;

public interface IWxUserService extends IService<WxUser> {

    /**
     * 微信授权登录
     *
     * @return
     */
    ReturnVO<Map> wxLogin(WxLoginDto wxLoginDto) throws Exception;

    /**
     * 授权登录后绑定手机号
     *
     * @param bingPhoneDto
     * @return
     */
    ReturnVO bindPhone(Long wxUserId, BingPhoneDto bingPhoneDto) throws Exception;

    /**
     * token换取用户信息
     *
     * @param wxUserId
     * @return
     */
    ReturnVO<WxUser> getWxUser(Long wxUserId);

    /**
     * token换取用户企业信息
     *
     * @param wxUserId
     * @return
     */
    ReturnVO<Enterprise> getEnterprise(Long wxUserId);

    /**
     * 发送验证码
     *
     * @param phone
     * @return
     */
    ReturnVO sendCode(String phone);

    /**
     * 导出企业用户信息(后台)
     *
     * @param response
     */
    void exportExcel(HttpServletResponse response) throws IOException;

    /**
     * 导入企业用户信息(后台)
     *
     * @param file
     * @return
     */
    ReturnVO importExcel(String token, MultipartFile file) throws IOException;

    /**
     * 微信用户列表
     *
     * @param type      0-平台用户 1-企业用户
     * @param wxUserDto
     * @return
     */
    ReturnVO<JgPageVo<List<WxUser>>> listWxUser(HttpServletResponse response,Integer type, WxUserDto wxUserDto, Long enterpriseId);

    /**
     * 根据条件查询用户列表(远程调用)
     *
     * @param map
     * @return
     */
    ReturnVO<List<Long>> listWxUserByMap(Map<String, String> map);

    /**
     * 添加职员用户
     *
     * @param wxUser
     * @return
     */
    ReturnVO saveWxUser(WxUser wxUser);

    /**
     * 根据当前企业身份调用微信用户列表
     *
     * @param enterpriseId
     * @param curWxUserDto
     * @return
     */
    ReturnVO<JgPageVo<List<WxUser>>> listCurWxUser(Long enterpriseId, CurWxUserDto curWxUserDto);

    /**
     * 列出绑定人员
     *
     * @param enterpriseId
     * @return
     */
    ReturnVO<JgPageVo<List<WxUser>>> listBindWxUser(Long enterpriseId, BindWxUserDto bindWxUserDto);

    /**
     * 根据id查询后台用户
     *
     * @param adminUserId
     * @return
     */
    ReturnVO<AdminUser> selectAdminUserById(Long adminUserId);

    /**
     * 根据id查询微信用户
     *
     * @param wxUserId
     * @return
     */
    ReturnVO<WxUser> selectWxUserId(Long wxUserId);

    /**
     * 用户修改信息
     *
     * @param updateWxUserDto
     * @return
     */
    ReturnVO updateWxUser(UpdateWxUserDto updateWxUserDto);

    /**
     * 访问首页时调用
     *
     * @param enterpriseId
     * @return
     */
    ReturnVO saveVisitNum(Long enterpriseId);

    /**
     * 根据微信用户id查询用户详情(远程调用)
     *
     * @param wxUserId
     * @return
     */
    FeignWxUserDto selectFeignWxUserDtoByWxUserId(Long wxUserId);

    /***
     *  根据讲师id查询用户详情(远程调用)
     * @param docentId
     * @return
     */
    FeignWxUserDto selectFeignWxUserDtoByDocentId(Long docentId);

    /**
     * 近30天用户数据(概况总览)
     *
     * @return
     */
    ReturnVO<WxUserVisitNumStatisticsVo> selectWxUserVisitNumStatisticsVo();

    /**
     * 近30天企业数据(概况总览)
     *
     * @return
     */
    ReturnVO<EnterpriseStatisticsVo> selectEnterpriseStatisticsVo();

    /**
     * 查询企业登录人数(概况总览)
     *
     * @return
     */
    ReturnVO<EnterpriseWxUserVisitNumStatisticsVo> selectEnterpriseWxUserVisitNumStatisticsVo(Long enterpriseId, EnterpriseWxUserVisitNumStatisticsDto enterpriseWxUserVisitNumStatisticsDto);

    /**
     * 查询该企业的综合数据(概况总览)
     *
     * @param enterpriseId
     * @return
     */
    ReturnVO<EnterpriseAllStatisticsVo> selectEnterpriseAllStatisticsVo(Long enterpriseId);

    /**
     * 删除微信用户（后台）
     * @param wxUserId
     * @return
     */
    ReturnVO deleteByWxUserId(Long wxUserId);

    /**
     * 将用户移出企业(后台)
     * @param wxUserId
     * @return
     */
    ReturnVO removeEnterprise(Long wxUserId);
}
